package com.itcam.string_;

/**
 * 效率： StringBuilder > StringBuffer > String
 */
public class StringVsStringBufferVsStringBuilder {
    public static void main(String[] args) {
        /*
         *  String:不可变字符序列，效率低，但复用率高
         *  StringBuffer:可变字符序列、效率较高、线程安全
         *  StringBuilder:可变字符序列、效率最高、线程不安全
         */

        long startTime = 0L;
        long endTime = 0L;

        // StringBuilder
        StringBuilder builder = new StringBuilder("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {//StringBuilder 拼接20000 次
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder 的执行时间：" + (endTime - startTime));

        // StringBuffer
        StringBuffer buffer = new StringBuffer("");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {//StringBuffer 拼接20000 次
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer 的执行时间：" + (endTime - startTime));

        // String
        String text = "";
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {//String 拼接20000
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String 的执行时间：" + (endTime - startTime));


        // 结论：
        // 1.如果字符串存在大量的修改操作，一般使用StringBuffer和StringBuilder
        // 2.如果字符串存在大量的修改操作，并在单线程的情况，使用StringBuilder
        // 3.如果字符串存在大量的修改操作，并在多线程的情况，使用StringBuffer
        // 4.如果字符串很少修改，被多个对象引用，使用String
    }
}
